package com.itcast.spring6.ioc.bean;

import com.itcast.spring6.ioc.application_context.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

/**
 * 注册spring bean三种方式
 * @author zhangtian105
 * @date 2023/4/27
 * @apiNote
 */
@Slf4j
@Import(value = BeanDefinitionTest.Config.class) // 第三种方式 通过@Import来进行导入
public class BeanDefinitionTest {
    public static void main(String[] args) {
        // 创建容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext() ;
        // 注册Configuration Class（配置类）
        applicationContext.register(Config.class);
        // 启动应用上下文
        applicationContext.refresh();

        // 按照类型依赖查找，spring不会出现重复注册的问题
        log.info("Config 类型的所有Bean: {}", applicationContext.getBeanNamesForType(Config.class)) ;
        log.info("User 类型的所有Bean: {}", applicationContext.getBeanNamesForType(User.class)) ;

        // 关闭spring应用上下文
        applicationContext.close();
    }

    @Component // 第二种方式 定义当前类为Spring Bean（组件）
    public static class Config {
        /**
         * 第一种方式
         * 通过java注解的方式顶 定义了一个Bean
         * 通过@Bean的方式定义Bean
         */
        @Bean(name = {"user", "myUser"})
        public User getUser() {
            User user = new User() ;
            user.setName("zhangsan");
            user.setAge(15);

            return user ;
        }
    }
}
